package utils

import (
	"fmt"
	"regexp"
	"strconv"
	"time"
)

func FormatTime(timeStr string) (string, error) {
	allTimeMatch := "^[1-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"
	allFlag, _ := regexp.Match(allTimeMatch, []byte(timeStr))
	if allFlag {
		timeFormat := timeStr[:19]
		err := isVerified(timeFormat)
		return timeFormat, err
	}

	nowDay := time.Now().Format("2006-01-02")
	timeMatch := "^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]"
	timeFlag, _ := regexp.Match(timeMatch, []byte(timeStr))
	if timeFlag {
		timeFormat := fmt.Sprintf("%s %s", nowDay, timeStr[:8])
		err := isVerified(timeFormat)
		return timeFormat, err
	}

	minuteMatch := "^[0-2][0-9]:[0-5][0-9]"
	minuteFlag, _ := regexp.Match(minuteMatch, []byte(timeStr))
	if minuteFlag {
		timeFormat := fmt.Sprintf("%s %s:00", nowDay, timeStr[:5])
		err := isVerified(timeFormat)
		return timeFormat, err
	}

	hourMatch := "^[0-2][0-9]"
	hourFlag, _ := regexp.Match(hourMatch, []byte(timeStr))
	if hourFlag {
		timeFormat := fmt.Sprintf("%s %s:00:00", nowDay, timeStr[:2])
		err := isVerified(timeFormat)
		return timeFormat, err
	}

	return "", fmt.Errorf("时间格式错误")
}

func isVerified(str string) error {
	var errMsg error
	year, err := strconv.Atoi(str[:4])
	if err != nil {
		errMsg = fmt.Errorf("月份错误: %v", err)
		return errMsg
	}
	month, err := strconv.Atoi(str[5:7])
	if err != nil || month > 12 || month < 1 {
		errMsg = fmt.Errorf("月份错误: %v", err)
		return errMsg
	}
	day, err := strconv.Atoi(str[8:10])
	if err != nil {
		errMsg = fmt.Errorf("天(日)错误: %v", err)
		return errMsg
	}
	hour, err := strconv.Atoi(str[11:13])
	if err != nil || hour > 23 || hour < 0 {
		errMsg = fmt.Errorf("小时错误: %v", err)
		return errMsg
	}
	minute, err := strconv.Atoi(str[14:16])
	if err != nil || minute > 59 || minute < 0 {
		errMsg = fmt.Errorf("分钟错误: %v", err)
		return errMsg
	}
	second, err := strconv.Atoi(str[17:19])
	if err != nil || second > 59 || second < 0 {
		errMsg = fmt.Errorf("秒错误: %v", err)
		return errMsg
	}

	if day < 1 {
		errMsg = fmt.Errorf("日期错误: %v", err)
		return errMsg
	}

	bMonth := []int{1, 3, 5, 7, 8, 10, 12}
	sMonth := []int{4, 6, 9, 11}
	if day < 1 {
		errMsg = fmt.Errorf("日期错误: %v", err)
		return errMsg
	} else if IntContains(bMonth, month) && day > 31 {
		errMsg = fmt.Errorf("日期错误: %v", err)
		return errMsg
	} else if IntContains(sMonth, month) && day > 30 {
		errMsg = fmt.Errorf("日期错误: %v", err)
		return errMsg
	} else if month == 2 {
		if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
			if day > 29 {
				errMsg = fmt.Errorf("日期错误: %v", err)
				return errMsg
			}

		} else if day > 28 {
			errMsg = fmt.Errorf("日期错误: %v", err)
			return errMsg
		}

	}
	return nil

}

func IntContains(list []int, num int) bool {
	for _, v := range list {
		if num == v {
			return true
		}
	}
	return false
}
